package cn.cjxy.web.session;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;

/**
 * 如果把用户名、密码等重要隐私都存到客户端的Cookie中，还是有泄密风险。为了更安全，把机密信息保存到服务器上，
 * 这就是 Session；Session是服务器上维护的客户档案，可以理解为服务器端数据库中有一张user表，里面存放了客户端的用户信息。SessionID就是这张表的主键ID；
 * Session与Cookie不同，session是属于服务器端的会话技术，数据是保存在服务器的内存中。每个会话中保存它自己的数据，其它会话不能访问。不同的会话之间不能实现数据的共享。
 *
 * Session与Cookie的区别
 *  ● 1）Cookie属于客户端会话技术，数据保存在浏览器端文件中（磁盘），Cookie中键和值都是String类型
 *  ● 2）Session属于服务器端的会话技术，数据保存服务器内存中，Session中键是String，值是Object类型
 *  ● 创建会话的方法：
 * 创建session	描述
 *      HttpSession request.getSession()	作用：通过请求对象创建一个会话对象 如果当前用户会话不存在，创建会话。如果会话已经存在，这个方法返回已经存在的会话对象。
 *      用户第1次访问，使用request.getSession()时创建一个会话对象HttpSession。
 *  HttpSession接口方法	作用
 *      String getId()	得到会话的ID，在服务器上唯一的32位的十六进制数
 *      long getCreationTime()	表示会话创建的时间，返回long类型。表示1970-1-1到这个时间之间相差的毫秒数
 *      long getLastAccessedTime()	表示会话上次访问的时间
 *      boolean isNew()	判断当前是否是一个新的会话，是的返回true
 *      ServletContext getServletContext()	通过会话得到上下文对象
 *
 * @author huangjie
 * @date 2025/9/27
 */
@WebServlet("/session1")
public class SessionDemo1 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html;charset=utf-8");
        PrintWriter out = resp.getWriter();


        //得到会话对象
        HttpSession session = req.getSession();
        //得到会话id
        out.println("会话id:"+session.getId()+"<hr>");
        //会话创建的时间
        out.println("会话创建的时间:"+session.getCreationTime()+"<hr>");
        //是否新的会话
        out.println("是否新的会话:"+session.isNew()+"<hr>");
        //通过会话得到上下文对象
        out.println("上下文对象:"+session.getServletContext()+"<hr>");

    }
}
